昨天我們看過了使用 Kotlin DAO 進行資料庫 CRUD 的方式。
今天我們來看看,除了基本的 CRUD,我們透過 DAO 還有什麼操作資料庫的方式。
我們可以用 sortedBy()
進行資料的排序
transaction {
SchemaUtils.create(Users)
User.new {
cityId = 1
name = "Carol"
}
User.new {
cityId = 1
name = "Alice"
}
User.new {
cityId = 2
name = "Bob"
}
User
.all()
.sortedBy{ it.name }
.forEach{
println("name: ${it.name}")
}
}
印出的結果根據 User.name
的字母順序排序,會是
name: Alice
name: Bob
name: Carol
如果我們希望反向排列,我們可以用 sortedByDescending()
User
.all()
.sortedByDescending{ it.name }
.forEach{
println("name: ${it.name}")
}
這樣,我們的資料就會依照字母順序反向排序了
name: Carol
name: Bob
name: Alice
有時候我們需要的資料型態,和資料庫內實際儲存的資料型態,可能是不太一樣的。
如果每次我們在使用資料時,都要進行資料型態轉換的話,會在很多地方撰寫轉換的邏輯,導致開發和維護上的困擾。
這時候,我們可以將資料轉換定義在 DAO 裏面,合併所有轉換資料邏輯的位置。
比方說,我們希望 user.cityId
在資料庫是整數,在程式裡面固定是字串的話,我們可以利用 transform()
函數,來改寫 User
類別
class User(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<User>(Users)
var cityId by Users.cityId.transform({ it.toInt() }, { it.toString() })
var name by Users.name
}
這樣會導致程式裏面的邏輯均要以字串處理,否則會無法編譯成功
transaction {
SchemaUtils.create(Users)
User.new {
cityId = "1"
name = "Carol"
}
User.new {
cityId = "1"
name = "Alice"
}
User.new {
cityId = "2"
name = "Bob"
}
最後我們可以利用 javaClass.kotlin
參數,來看 cityId
拿到的型態
User
.all()
.first()
.let {
println(it.cityId.javaClass.kotlin)
}
執行程式後,我們會看到
class kotlin.String
代表我們撰寫的程式內,cityId
確實被轉換成字串型態了。